package br.com.pguide.webservice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;

public class WebService extends Activity {

//	public static String URL = "http://192.168.1.113:8000/"; // (uneal)
//	public static String URL = "http://192.168.1.2:8000/"; 
	public static String URL = "http://192.168.2.1:8000/"; // (casa)
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
	
	public static String get_nome_item(String username, int id) throws JSONException {
		String url = "getNomeItem?username="+username+"&id="+id;
		String retorno = get_response(url);
		JSONObject jobj = new JSONObject(retorno);
		return jobj.getString("nome");
	}
	
	public static boolean autenticacao_login(String username, String password) {
		/*
		 * comunica-se com o servidor django e
		 * retorna True se o usuário e senha forem válidos
		 */
		
		String url = "login?username=" + username + "&password=" + password;
		String login = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(login);
			if (loginJSONObject.getBoolean("login")){
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	public static String buscar_ofertas(String username) {
		/*
		 * realiza a busca por recomendação de ofertas para um usuário
		 * */
		String url = "buscarOfertas?username=" + username;
		String itens = get_response(url);
		return itens;
	}
	
	public static boolean avaliar_estabelecimento(String username, int estabelecimento, float avaliacao) throws JSONException {
		/*
		 * realiza a avaliação de um estabelecimento
		 * */
		String url = "avaliarEstabelecimento?username=" + username + "&" +
				"estabelecimento="+estabelecimento + "&" +
				"avaliacao="+avaliacao;
		JSONObject jobject = new JSONObject();
		try {
			String retorno = get_response(url);
			jobject = new JSONObject(retorno);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jobject.getBoolean("ok"); // se der certo retorna true, se der errado retorna false
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * o cadastro de um novo usuário.
	 * retorna uma string "ok" caso o usuário seja cadastrado com sucesso
	 * ou retorna o erro caso não seja cadastrado 
	 */
	public static String cadastrar_usuario(String nome, String sobrenome, String cidade, String estado, String email, String senha) {
		String url = "cadastrar_usuario?" +
				"nome=" + nome + "&" +
				"sobrenome=" + sobrenome + "&" +
				"cidade=" + cidade + "&" +
				"estado=" + estado + "&" +
				"email=" + email + "&" +
				"senha=" + senha;
		String cadastrar = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(cadastrar);
			if (loginJSONObject.getBoolean("sucesso_cadastro")){
				return "ok";
			} else {
				return loginJSONObject.getString("erro");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * a lista das formas de pagamento possíveis
	 */
	public static String get_formas_de_pagamento(String username) {
		String url = "getFormasDePagamento?username="+username;
		String formas = get_response(url);
		return formas.toString();
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * a lista das formas de pagamento possíveis
	 */
	public static String get_estabelecimentos(String username, String search) {
		String url = "getEstabelecimentos?username="+username + "&"+ 
					 "palavra_chave="+search;
		String estabs = get_response(url);
		return estabs.toString();
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * os dados de preferencias do usuario
	 */
	public static String get_preferencias(String username) {
		String url = "getPreferencias?username="+username;
		String preferencias = get_response(url);
		return preferencias.toString();
	}

	/*
	 * comunica-se com o servidor django solicitando
	 * o cadastro de preferências do usuário
	 * retorna "ok" se sucesso ou retorna erro em caso de falha
	 */
	public static String cadastrar_preferencias(double minPreco, double maxPreco,
												 double minDistancia, double maxDistancia,
												 double minReputacao, String formasDePagamento,
												 double ir_preco, double ir_proximidade, double ir_reputacao,
												 String username) {
		
		String url = "cadastrar_preferencias?" +
				"username="+username+
				"&minPreco=" + minPreco +
				"&maxPreco=" + maxPreco +
				"&irPreco=" + ir_preco +
				"&minDistancia=" + minDistancia +
				"&maxDistancia=" + maxDistancia +
				"&irDistancia=" + ir_proximidade +
				"&minReputacao=" + minReputacao +
				"&irReputacao=" + ir_reputacao +
				"&formasDePagamento=" + formasDePagamento;
		String cadastrar = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(cadastrar);
			if (loginJSONObject.getBoolean("sucesso_cadastro")){
				return "ok";
			} else {
				return loginJSONObject.getString("erro");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * adicionar um item a uma lista de compras de um determinado usuário
	 * retorna uma string "ok" caso o item seja adicionado com sucesso
	 * ou retorna o erro caso não seja adicionado 
	 */
	public static String adicionar_item_na_lista (String username, int item_id, float quantidade, int status) {
		String url = "adicionarItemNaLista?" +
					 "username=" + username + "&" +
					 "item=" + item_id + "&" +
					 "status=" + status + "&" +
					 "quantidade=" + quantidade;
		String add_item = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(add_item);
			if (loginJSONObject.getBoolean("sucesso_add_item")){
				return "ok";
			} else {
				return loginJSONObject.getString("erro");
			}
		} catch (Exception e) {
			return e.getMessage().toString();
		}
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * alteração do status de um pedido em uma lista de compras de um 
	 * determinado usuário, retorna uma string "ok" caso o status seja alterado
	 *  com sucesso ou retorna o erro caso não seja 
	 */
	public static String alterar_status_item (String username, int id, int status) {
		String url = "alterarStatusDoItemDaLista?" +
					 "username=" + username + "&" +
					 "id=" + id + "&" +
					 "status=" + status;
		String alterar = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(alterar);
			return loginJSONObject.getString("sucesso_alterar_status_item");
		} catch (Exception e) {
			return e.getMessage().toString();
		}
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * remoção do status de um pedido em uma lista de compras de um 
	 * determinado usuário, retorna uma string "ok" caso seja removido
	 *  com sucesso ou retorna o erro caso não seja 
	 * OBS: a remoção dos itens da lista não implica na deleção do banco de dados,
	 * 		apenas na alteração de status, visto que os dados ainda serão relevantes
	 * 		para futuras análises de perfil do usuário
	 */
	public static String remover_item_da_lista (String username, int id) {
		String url = "removerItemDaLista?" +
					 "username=" + username + "&" +
					 "id=" + id;
		String remover = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(remover);
			return loginJSONObject.getString("sucesso_remover_item_da_lista");
		} catch (Exception e) {
			return e.getMessage().toString();
		}
	}
	
	/*
	 * comunica-se com o servidor django solicitando
	 * a remoção de todos os itens da lista de compras de um determinado usuário
	 * retorna uma string "ok" caso o item seja adicionado com sucesso
	 * ou retorna o erro caso não seja adicionado 
	 * OBS: a remoção dos itens da lista não implica na deleção do banco de dados,
	 * 		apenas na alteração de status, visto que os dados ainda serão relevantes
	 * 		para futuras análises de perfil do usuário
	 */
	public static String limpar_lista (String username) {
		String url = "limparListaDeCompras?" +
					 "username=" + username;
		String limpar = get_response(url);
		
		try {
			JSONObject loginJSONObject = new JSONObject(limpar);
			if (loginJSONObject.getBoolean("sucesso_limpar_lista")){
				return "ok";
			} else {
				return loginJSONObject.getString("erro");
			}
		} catch (Exception e) {
			return e.getMessage().toString();
		}
	}
	
	/*
	 * recupera a lista de compras ativa do usuário
	 */
	public static String get_lista_de_compras (String email) {
		String url = "getListaDeCompras?" + 
					 "username=" + email;
		String results = get_response(url);
		
		return results;
	}
	
	/*
	 * pesquisa por nome
	 */
	public static String pesquisar(String email, String busca) {
		String url = "pesquisar?" + 
					 "username=" + email + "&" +
					 "palavra_chave=" + busca;
		String results = get_response(url);
		
		return results;
	}
	
	/*
	 * pesquisa por codigo
	 */
	public static String get_item_id (String email, String codigo) {
		String url = "getItemID?" + 
					 "username=" + email + "&" +
					 "codigo=" + codigo;
		String results = get_response(url);
		
		return results;
	}
	
	/*
	 * pesquisa por codigo
	 */
	public static String get_item (String email, int id) {
		String url = "getItem?" + 
					 "username=" + email + "&" +
					 "id=" + id;
		String results = get_response(url);
		
		return results;
	}
	
	/*
	 * captura o nome de uma marca solicitado via ID
	 */
	public static String get_marca(int id) {
		String url = "getMarca?marca_id=" + id;
		String results = get_response(url);
		String marca = null;
		try {
			JSONObject json_object = new JSONObject(results);
			marca = json_object.getString("marca");
		} catch (Exception e) {
			
		}
		return marca;
	}
	
	/*
	 * captura a reputação de um estabelecimento solicitado via ID
	 */
	public static String get_reputacao(int id) {
		String url = "getReputacao?id=" + id;
		String results = get_response(url);
		return results;
	}
	
	/*
	 * captura um perfil de usuário de acordo com seu email cadastrado
	 */
	public static String get_perfil(String email) {
		String url = "getProfile?username=" + email;
		String profile = get_response(url);
		return profile;
	}
	
	/*
	 * solicita a lista de categorias disponíveis
	 */
	public static String get_categorias() {
		String url = "getCategorias";
		String categorias = get_response(url);
		return categorias;
	}
	
	/*
	 * solicita a lista de unidades de medida disponíveis
	 */
	public static String get_unidades_de_medida() {
		String url = "getUnidadesDeMedida";
		String unidades = get_response(url);
		return unidades;
	}
	
	/*
	 * busca por recomendações para um produto
	 */
	public static String busca_recomendacao_produto_unico(String username, int id_item, double latitude, double longitude){
		String url = "buscarRecomendacaoProduto?" +
				"username=" + username + "&" +
				"ID=" + id_item + "&" +
				"latitude=" + latitude + "&" +
				"longitude=" + longitude;
		
		String resultados = get_response(url);
		return resultados;
	}
	
	/*
	 * busca por recomendações para uma lista de compras
	 */
	public static String busca_recomendacao_lista(String username, double latitude, double longitude){
		String url = "buscarRecomendacaoLista?" +
				"username=" + username + "&" +
				"latitude=" + latitude + "&" +
				"longitude=" + longitude;
		
		String resultados = get_response(url);
		return resultados;
	}
	
	/*
	 * recupera um estabelecimento através de seu ID
	 */
	public static String get_estabelecimento(int id) {
		String url = "getEstabelecimento?id=" + id;
		String estabelecimento = get_response(url);
		return estabelecimento;
	}
	
	/*
	 * recupera um objeto ItemEstabelecimento através de seu ID
	 */
	public static String get_item_estabelecimento(int id) {
		String url = "getItemEstabelecimento?id=" + id;
		String estabelecimento = get_response(url);
		return estabelecimento;
	}
	
	
	
	
	
	// ============ não bulir daqui pra baixo ============ //
	
    public static String get_response(String url) {
    	/*
    	 * acessa uma URL do servidor django e recebe o retorno
    	 * através do padrão json em uma string
    	 */
    	StringBuilder builder = new StringBuilder();
    	HttpClient client = new DefaultHttpClient();
    	HttpGet httpGet = new HttpGet(URL + url);
    	try {
    		HttpResponse response = client.execute(httpGet);
    		StatusLine statusLine = response.getStatusLine();
    		int statusCode = statusLine.getStatusCode();
    		if (statusCode == 200) {
    			HttpEntity entity = response.getEntity();
    			InputStream content = entity.getContent();
    			BufferedReader reader = new BufferedReader(
    					new InputStreamReader(content));
    			String line;
    			while ((line = reader.readLine()) != null) {
    				builder.append(line);
    			}
    		} else {
    			// TODO
    		}
    	} catch (ClientProtocolException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    	return builder.toString();
    }
}
